/*
 * @Date         : 2024-03-26 14:34:25
 * @Description  : 农行埋点
 */

import Base from "../base"
import { useWindowValue } from "../utils"

class Abc extends Base {
  constructor(config = {}) {
    super(config)
    this.sdkConfig = {
      sdk_url: "https://public-oss-file.zmaxfilm.com/applet/js/sensors_abc.js",
      name: "sensors",
      // server_url: 'https://firefly.test.abchina.com:8090/nginx/firefly-collection/Collect/MobileData',//测试
      server_url: "https://firefly.abchina.com.cn/firefly-collection/Collect/MobileData", // 正式
      // is_track_single_page: true, // 单页面配置，默认开启，若页面中有锚点设计，需要将该配置删除，否则触发锚点会多触发 $pageview 事件
      use_client_time: true,
      app_js_bridge: true, // 配置H5与APP打通，如果H5工程集成在APP中，推荐开启
      firefly_system_number: this.config.fireflySystemNumber || "", // 接入方在ITA中的模块编号，必传项 比如 BDC201710_0201
      firefly_apc_type: 1, // H5默认1，必传项
      firefly_model_name: this.config.fireflyModelName || "", // 接入方模块名称，必传项
      js_error: false, // 开启错误采集 默认false 不开启 分析端暂不支持
      max_string_length: 3000, // 可通过配置max_string_length自定义采集字段的长度，该配置项应为大于0小于3000的整数，最大不超过3000，采集字段长度超过3000的部分会被自动截取。如果不配置自定义长度，采集字段默认长度不超过500，长度超过500的部分会被自动截取。
      heatmap: {
        // 是否开启点击图，default 表示开启，自动采集 $WebClick 事件，可以设置 'not_collect' 表示关闭。
        clickmap: "not_collect"
        // clickmap: 'default',
        //     collect_tags: {
        //     div: {
        //       max_level: 3 // 默认是 1，即只支持叶子 div。可配置范围是 [1, 2, 3],非该范围配置值，会被当作 1 处理。
        //     },
        //     li: true,
        //     img: true,
        //     svg: true
        //   }
      }
    }
  }

  init() {
    return new Promise(async (resolve, reject) => {
      this.log("农业银行埋点开始初始化")
      try {
        await this.#initSdk(this.sdkConfig)
        useWindowValue({
          key: "sensors",
          success: (sdk) => {
            this.core = sdk
            this.core.para = this.sdkConfig
            this.isReady = true
            this.emit("ready", this)
            resolve(this)

            const params = {
              platForm: "h5",
              title: this.config.title,
              firefly_prod_type: this.config.fireflyProdType || "",
              firefly_prod_code: this.config.fireflyProdCode || "",
              firefly_prod_name: this.config.fireflyProdName || ""
            }
            this.track("autoTrackSinglePage", params)
            this.log("农业银行埋点初始化成功")
          },
          fail: () => {
            reject({ errMsg: "未正确获取到埋点加载内容" })
            this.emit("error", { errMsg: "未正确获取到埋点加载内容" })
          }
        })
      } catch (error) {
        reject(error)
        this.emit("error", error)
      }
    })
  }

  #initSdk(config = {}) {
    return new Promise((resolve) => {
      var p = config.sdk_url
      var n = config.name
      var w = window
      var d = document
      var s = "script"
      var x = null
      var y = null
      if (typeof w["sensorsDataAnalytic201505"] !== "undefined") {
        return resolve()
        // return false;
      }
      w["sensorsDataAnalytic201505"] = n
      w[n] =
        w[n] ||
        function (a) {
          return function () {
            ;(w[n]._q = w[n]._q || []).push([a, arguments])
          }
        }
      // ifs数组要改
      const ifs = [
        "track",
        "quick",
        "register",
        "registerPage",
        "registerOnce",
        "clearAllRegister",
        "trackSignup",
        "trackAbtest",
        "setProfile",
        "setOnceProfile",
        "appendProfile",
        "incrementProfile",
        "deleteProfile",
        "unsetProfile",
        "identify",
        "login",
        "logout",
        "trackLink",
        "deleteItem",
        "setItem",
        "trackCustom",
        "initError"
      ]
      for (var i = 0; i < ifs.length; i++) {
        w[n][ifs[i]] = w[n].call(null, ifs[i])
      }
      if (!w[n]._t) {
        x = d.createElement(s)
        y = d.getElementsByTagName(s)[0]
        x.async = 1
        x.src = p
        x.setAttribute("charset", "UTF-8")
        y.parentNode.insertBefore(x, y)
        w[n].para = config
      }
      resolve()
    })
  }

  track(name, params = {}) {
    return new Promise((resolve, reject) => {
      this.checkInit({
        success: () => {
          try {
            this.core.quick(name, params)
            resolve()
          } catch (err) {
            reject(err)
          }
        },
        fail: (err) => reject(err)
      })
    })
  }
}

export default Abc
